package com.nicolascarrascob.clientesoap;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import com.google.gson.JsonObject;
import com.nicolascarrascob.clientesoap.R;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewDebug.IntToString;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class VerPrestacion extends ListActivity {

	private TextView txtResultadoServicio;
	ArrayList<String> prestaciones;
	Spinner prestacionesSpinner;
	ArrayList<Paciente> pacientes;

	private String URL = Constantes.HOST
			+ "/ServicioWebClinica/services/FichaPacienteORMWS";
	private String NAMESPACE = "http://ws";

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_ver_prestacion);
		pacientes = new ArrayList<Paciente>();
		txtResultadoServicio = (TextView) findViewById(R.id.txt_resultado_servicio);
		prestaciones = new ArrayList<String>();
		prestacionesSpinner = (Spinner) findViewById(R.id.agregarPrestacion);
		new ObtenerPrestacionesBackground().execute();

	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.add_paciente:
			Intent intent = new Intent(VerPrestacion.this, AddDiagnostico.class);
			startActivity(intent);
			return true;
		default:
			return true;
		}
	}

	public void ingresar(View v) {
		JsonObject jsonObjectPelicula = new JsonObject();

		// jsonObjectPelicula.addProperty("prestacion_id",
		// Integer.parseInt(prestaciones.get(prestacionesSpinner.getSelectedItemPosition())));
		// jsonObjectPelicula.addProperty(prestaciones.get(prestacionesSpinner.getSelectedItemPosition());
		txtResultadoServicio.setText("");
		Log.d("", URL);
		new ObtenerPacientesBackground().execute(Integer.parseInt(prestaciones
				.get(prestacionesSpinner.getSelectedItemPosition())));
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_ver_prestacion, menu);
		return true;
	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		// TODO Auto-generated method stub
		Intent intent = new Intent(VerPrestacion.this, UpdatePaciente.class);
		intent.putExtra("paciente", pacientes.get(position));
		startActivity(intent);
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		pacientes = new ArrayList<Paciente>();
		setListAdapter(new PacienteAdapter(VerPrestacion.this, 0, pacientes));
	}

	class ObtenerPrestacionesBackground extends
			AsyncTask<Void, Void, HashMap<String, String>> {

		private ProgressDialog progressDialog;

		@Override
		protected void onPreExecute() {
			progressDialog = ProgressDialog.show(VerPrestacion.this,
					"Clinica del Sur",
					"Espere mientras se cargan los datos...", true);
			super.onPreExecute();
		}

		@Override
		protected HashMap<String, String> doInBackground(Void... params) {

			HashMap<String, String> resultado = new HashMap<String, String>();
			String prestacionesJSON = "";
			String METHOD_NAME = "getPrestaciones";
			String SOAP_ACTION = NAMESPACE + "/" + METHOD_NAME;
			SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
			SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
					SoapEnvelope.VER11);
			soapEnvelope.dotNet = true;
			soapEnvelope.implicitTypes = true;
			soapEnvelope.setOutputSoapObject(request);

			HttpTransportSE aht = new HttpTransportSE(URL);

			try {
				aht.call(SOAP_ACTION, soapEnvelope);
				SoapPrimitive resultString = (SoapPrimitive) soapEnvelope
						.getResponse();
				prestacionesJSON = resultString.toString();
				resultado.put("prestaciones", prestacionesJSON);

			} catch (IOException e) {
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				e.printStackTrace();
			}
			return resultado;
		}

		@Override
		protected void onPostExecute(HashMap<String, String> result) {
			super.onPostExecute(result);
			progressDialog.dismiss();
			// Valido que tenga la informacion necesaria
			if (result.containsKey("prestaciones")
					&& !"".equals(result.get("prestaciones"))) {
				try {
					ArrayList<String> prestacionesList = new ArrayList<String>();
					JSONObject prestacionResultado = new JSONObject(
							result.get("prestaciones"));
					String contenido = prestacionResultado
							.getString("Contenido");
					JSONObject prestacionesJSONArray = new JSONObject(contenido);
					prestacionesJSONArray.names();
					prestacionesJSONArray.keys();
					for (Iterator iterator = prestacionesJSONArray.keys(); iterator
							.hasNext();) {
						String string = (String) iterator.next();
						prestaciones.add(string);
						prestacionesList.add(prestacionesJSONArray
								.getString(string));

					}

					ArrayAdapter<String> prestacionesAdapter = new ArrayAdapter<String>(
							VerPrestacion.this,
							android.R.layout.simple_spinner_item,
							prestacionesList);
					prestacionesSpinner.setAdapter(prestacionesAdapter);

				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			} else {
				Toast.makeText(VerPrestacion.this,
						"Error al obtener las prestaciones", Toast.LENGTH_LONG)
						.show();
			}
		}
	}

	class ObtenerPacientesBackground extends AsyncTask<Integer, Void, String> {

		private ProgressDialog progressDialog;

		@Override
		protected void onPreExecute() {
			progressDialog = ProgressDialog.show(VerPrestacion.this,
					"Clinica del Sur",
					"Espere mientras se carga la lista de pacientes...", true);
			super.onPreExecute();
		}

		@Override
		protected String doInBackground(Integer... params) {

			String resultadoJSON = "";
			String METHOD_NAME = "getPacientePrestacion";
			String SOAP_ACTION = NAMESPACE + "/" + METHOD_NAME;
			SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
			SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
					SoapEnvelope.VER11);
			soapEnvelope.dotNet = true;
			soapEnvelope.implicitTypes = true;
			soapEnvelope.setOutputSoapObject(request);

			request.addProperty("prestacion_id", params[0]);

			HttpTransportSE aht = new HttpTransportSE(URL);
			Log.d("Cliente SOAP", "Iniciando Consulta");
			try {
				aht.call(SOAP_ACTION, soapEnvelope);
				SoapPrimitive resultString = (SoapPrimitive) soapEnvelope
						.getResponse();
				resultadoJSON = resultString.toString();
				Log.d("Cliente SOAP", "Finalizando Consulta");

			} catch (IOException e) {
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				e.printStackTrace();
			}
			return resultadoJSON;
		}

		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			progressDialog.dismiss();
			if ("".equals(result)) {
				Toast.makeText(VerPrestacion.this,
						"Error al obtener los datos", Toast.LENGTH_LONG).show();
			} else {
				try {
					pacientes = new ArrayList<Paciente>();
					String texto = "";
					Log.d("", result);
					JSONObject resultado = new JSONObject(result);
					texto += resultado.getString("Titulo") + "\n";
					String contenido = resultado.getString("Contenido");
					Log.d("ClienteSoap", contenido);
					JSONArray pacientesJSONArray = new JSONArray(contenido);
					int cantPacientes = pacientesJSONArray.length();
					for (int i = 0; i < cantPacientes; i++) {
						Paciente paciente = new Paciente();

						texto += pacientesJSONArray.getJSONObject(i).getString(
								"Run")
								+ "\n";
						paciente.setRun(pacientesJSONArray.getJSONObject(i)
								.getInt("Run"));
						texto += pacientesJSONArray.getJSONObject(i).getString(
								"Nombre")
								+ "\n";
						paciente.setNombre(pacientesJSONArray.getJSONObject(i)
								.getString("Nombre"));
						texto += pacientesJSONArray.getJSONObject(i).getString(
								"Direccion")
								+ "\n";
						paciente.setDireccion(pacientesJSONArray.getJSONObject(
								i).getString("Direccion"));

						pacientes.add(paciente);
					}
					setListAdapter(new PacienteAdapter(VerPrestacion.this, 0,
							pacientes));
				} catch (JSONException e) {
					Toast.makeText(VerPrestacion.this,
							"Error al obtener la lista de pacientes",
							Toast.LENGTH_LONG).show();
				}
			}
		}
	}

}
